﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BusinessLayer.Model.Entities;

namespace BusinessLayer.Model.Repositories.Abstract
{
    /// <summary>
    /// Interface que define que métodos debe implementar el repositorio
    /// de las cuentas
    /// </summary>
    public interface IAccountRepository
    {
        /// <summary>
        /// Devuelve el objeto Account que concuedra con el nombre de usuario
        /// especificado.
        /// </summary>
        /// <param name="username">Nombre de usuario de la cuenta</param>
        /// <returns>Objeto Account</returns>
        Account FetchByUsername(string username);

        /// <summary>
        /// Agrega un objeto Account al repositorio
        /// </summary>
        /// <param name="account">Objeto Account a agregar.</param>
        void    Add(Account account);

        /// <summary>
        /// Cambiar la contraseña de la cuenta
        /// </summary>
        /// <param name="account">Objeto que representa la cuenta</param>
        /// <param name="newpass">Nueva contraseña</param>
        void    ChangePassword(Account account, string newpass);

        /// <summary>
        /// Para saber si hay una cuenta definida
        /// </summary>
        /// <returns></returns>
        bool AccountExists();

        /// <summary>
        /// Actualiza la cuenta en el repositorio
        /// </summary>
        /// <param name="account">Cuenta a actualizar</param>
        void    UpdateOnSubmit(Account account);

        /// <summary>
        /// Guarda los cambios hechos al repositorio.
        /// </summary>
        void    SubmitChanges();
    }
}
